import psutil,sys,os
import time

'''
在我机器上有两个进程会偶尔占用一个核心跑满cpu,导致cpu电压升高和风扇狂转
vmnat.exe 和 MSI_TraceFPS.exe

使用一个脚本,每30秒检测一次指定进程数组中每个进程的cpu占用率,如果连续4次(同一个pid)占用率超过90%,就终止它

ChatGPT 说：
ChatGPT
要实现这样的功能，我们可以编写一个脚本，利用 psutil 每 30 秒检测一次指定进程数组中每个进程的 CPU 占用率。如果某个进程连续 4 次（即 2 分钟） CPU 占用率超过 90%，就终止该进程。

以下是具体实现：

实现步骤
每 30 秒检测一次指定的进程 CPU 占用率。
使用字典记录每个进程的高 CPU 占用率次数（即占用率超过 90% 的次数）。
如果某个进程（基于 PID）连续 4 次 CPU 占用率超过 90%，终止该进程，并从监控中移除它。
'''


def monitor_processes(process_names):
    # 用于记录每个PID的高CPU使用次数
    high_cpu_count = {}

    while True:
        for proc in psutil.process_iter(['name', 'pid']):
            try:
                # 检查进程名称是否在监控列表中
                if proc.info['name'] in process_names:
                    pid = proc.info['pid']
                    cpu_usage = proc.cpu_percent(interval=1)

                    print(f"进程: {proc.info['name']} | PID: {pid} | CPU占用率: {cpu_usage}%")

                    # 检查CPU占用率是否超过90%
                    if cpu_usage > 90:
                        # 增加该PID的高CPU使用计数
                        if pid in high_cpu_count:
                            high_cpu_count[pid] += 1
                        else:
                            high_cpu_count[pid] = 1
                    else:
                        # 如果CPU占用率未超过90%，重置计数
                        high_cpu_count[pid] = 0

                    # 检查是否连续4次CPU占用率超过90%
                    if high_cpu_count.get(pid, 0) >= 4:
                        print(f"进程 {proc.info['name']} (PID: {pid}) 连续4次CPU占用率超过90%，即将终止它。")
                        proc.terminate()
                        proc.wait()  # 等待进程完全终止
                        print(f"进程 {proc.info['name']} (PID: {pid}) 已终止。")
                        # 从计数字典中移除已终止的进程
                        del high_cpu_count[pid]

            except (psutil.NoSuchProcess, psutil.AccessDenied):
                continue  # 如果进程不存在或无权限访问，跳过该进程

        # 每30秒检测一次
        time.sleep(30)

# 指定要监控的进程名称列表

#更新到 VM 17.6 之后 vmnat.exe 不需要处理了
process_names = ["MSI_TraceFPS.exe"]
monitor_processes(process_names)
